package com.lml.interviewTest;

import org.junit.jupiter.api.Test;

import java.io.File;
import java.time.LocalDateTime;
import java.util.*;

/**
 * @author Administrator
 * @date 2021/6/1 15:19
 * Description:
 */
public class Test02 {
    public static void main(String[] args) {
//        1. HashMap 排序题，上机题。(本人主要靠这道题入职的第一家公司)
//                已知一个 HashMap<Integer，User>集合， User 有 name（String）和 age（int）属性。请写一个方法实现对
//        HashMap 的排序功能，该方法接收 HashMap<Integer，User>为形参，返回类型为 HashMap<Integer，User>，
//        要求对 HashMap 中的 User 的 age 倒序进行排序。排序时 key=value 键值对不得拆散。
        HashMap<Integer, User> users = new HashMap<>();
        users.put(1, new User("张三", 25));
        users.put(3, new User("李四", 22));
        users.put(2, new User("王五", 28));
        System.out.println(users);
        HashMap<Integer, User> sortHashMap = sortHashMap(users);
        System.out.println(sortHashMap);
    }

    private static HashMap<Integer, User> sortHashMap(HashMap<Integer, User> users) {
        // 首先拿到 map 的键值对集合
        Set<Map.Entry<Integer, User>> entries = users.entrySet();
        // 将 set 集合转为 List 集合，为什么，为了使用工具类的排序方法
        ArrayList<Map.Entry<Integer, User>> entryArrayList = new ArrayList<>(entries);
        // 使用 Collections 集合工具类对 list 进行排序，排序规则使用匿名内部类来实现
        entryArrayList.sort((x, y) -> {
            return y.getValue().getAge() - x.getValue().getAge();
        });
        LinkedHashMap<Integer, User> map = new LinkedHashMap<>();
        entryArrayList.forEach(x -> map.put(x.getKey(), x.getValue()));
        return map;
    }

    @Test
    public void test01() {
        //不使用新变量 交换a和b的值
        int a = 2;
        int b = 3;

        //1.加法
//        a = a + b;
//        b = a - b;
//        a = a - b;

        //2.异或
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.println("a-->" + a);
        System.out.println("b-->" + b);
    }

    @Test
    public void test02() {
        //假设有 50 瓶饮料，喝完三个空瓶可以换一瓶饮料，依次类推，请问总共喝了多少饮料
        int total = getTotal(50);
        System.out.println("total = " + total);
    }

    //3个空瓶换取一瓶饮料
    public static int getTotal(int num) {
        if (num < 3) {
            return 0;
        }
        return num + getTotal(num / 3 + num % 3);
    }

    //另一种解法
    @Test
    public void test03() {
        int n = 50; //初始饮料总数
        int i = 0; //兑换次数
        while (true) {
            n -= 3; //喝 3 瓶
            n++; //兑换 1 瓶
            i++; //兑换次数+1
            if (n < 3) {
                System.out.println("共喝了" + (50 + i) + "瓶");
                break;
            }
        }
    }

    @Test
    public void test04() {
        //输出顺序是什么
        split(12);
    }

    public static int split(int num) {
        if (num > 1) {
            if (num % 2 != 0)
                System.out.println(split((num + 1) / 2)); //2
            System.out.println(split(num / 2)); //6 3 1
        }
        return num;
    }

    @Test
    public void test05() {
        //猴子吃桃问题
        System.out.printf("第一天的桃子数量为：%d", countPeach(1));
    }

    public int countPeach(int num) {
        //猴子吃桃问题
        //f(10)=1
        //公式：f(x) - f(x)/2 - 1 = f(x+1)
        //==> f(x)/2 - 1 = f(x+1)
        //==> f(x) - 2 = 2f(x+1)
        //==> f(x) = 2(f(x+1)+1)
        if (num == 10) {
            return 1;
        } else {
            return 2 * (countPeach(num + 1) + 1);
        }
    }

    @Test
    public void test06() {
        File file = new File("src\\main\\java\\com\\lml\\interviewTest\\Test02.java");

        long createTime = file.lastModified();
        long lastModifiedTime = file.lastModified();

        Date createDate = new Date(createTime);
        Date lastModifiedDate = new Date(lastModifiedTime);

        System.out.println("创建时间: " + createDate);
        System.out.println("最后修改时间: " + lastModifiedDate);
    }

}
